package cn.tedu.seri;

import java.io.*;

/**本类用于测试序列化与反序列化
 * 序列化：是指把程序中的Java对象，永久保存在磁盘中，相当于是写出的过程
 * 方向：out  用到的流是：ObjectOutputStream
 * 反序列化：是指把已经序列化在文件中保存的数据，读取/恢复到java程序中的过程
 * 方向：in   用到的流是：ObjectInputStream*/
public class TestSerializable {
    public static void main(String[] args) {
        method1();//本类用于完成序列化的功能
        method2();//本类用于完成反序列化的功能
    }

    /**反序列化方法*/
    private static void method2() {
        //1.声明在本方法内都生效的局部变量，局部变量需要初始化，值为null
        ObjectInputStream in = null;
        //2.由于IO操作可能会产生异常，所所以try-catch-finally
        try {
            //3.创建反序列化流对象
            in = new ObjectInputStream(new FileInputStream("F://ready//1.txt"));

            //4.通过OIS反序列化读取对象
            System.out.println(in.readObject());
            System.out.println("恭喜您！反序列化成功！");

        } catch (Exception e){
            System.out.println("很抱歉！反序列化失败！");
            e.printStackTrace();
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    /**序列化方法*/
    private static void method1() {
        //1.声明在本方法内都生效的局部变量，局部变量需要初始化，值为null
        ObjectOutputStream out = null;
        //2.由于IO操作可能会产生异常，所所以try-catch-finally
        try{
            //3.创建序列化流对象
            out = new ObjectOutputStream(
                    new FileOutputStream("F:\\ready\\1.txt"));
            //4.指定序列化要输出的对象
            Student obj = new Student("海绵宝宝",3,"大海里",'男');

            //5.通过OOS流对象来序列化输出Student对象
            out.writeObject(obj);

            System.out.println("恭喜您！序列化成功！");

        } catch (Exception e){
            System.out.println("很抱歉！序列化失败！");
            e.printStackTrace();
        }finally {
            //5.关流
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }


}
